// 
// @Auther: by wujehy
// @Email:wujehy@qq.com
// @Data:2021/1/31.
// @Time:下午3:32.
// 
//

#include <vector>
#include <sstream>
#include <dialog.h>
#include "Manager.h"
#include "BaseMod.h"

Manager::Manager()
{
 LOGDEBUF()<<" 管理器 构造成功 "<<std::endl;
}

void Manager::rount(std::unique_ptr<DataPacket> packet)
{
    LOGINFO()<<"正在路由数据包 ... "<<std::endl;
    std::stringstream sskey;
    sskey << "mod_" << packet->type << "_" <<packet->subtype;
    auto findmod = m_mod_map.find(sskey.str());
    if (findmod ==m_mod_map.end())
    {
        LOGERROR() <<"模块未找到, 数据包不是我们系统支持的业务 , 或者 未注册该模块 : "<<std::endl
        << "\t type = " << packet->type <<" subtype = " <<packet->subtype<<std::endl;
        return;
    }
    // 模块存在
    LOGINFO() <<"模块找到 , 正在转发数据包到模块内部处理" <<std::endl;
    findmod->second->onMessage(std::move(packet));
    LOGINFO()<<"处理一个数据包完成..."<<std::endl;
}

bool Manager::regiserMod(BaseMod *mod, bool autoDel)
{
    std::stringstream sskey;
    sskey << "mod_" << mod->getType() << "_" << mod->getSubType();
    auto pt = m_mod_map.insert( {sskey.str(), mod} );
    // NOTE : if 一个函数 里不要嵌套太多层 如下是一个优化过程 , 否则代码会很烂
    if (pt.second)
    {
        LOGDEBUF() << " 模块注册成功 , 模块信息 : " << mod->getInfo() << std::endl;
        return true;
    }
    // 失败
    LOGINFO() << " 模块注册失败 : type = " << mod->getType() << ", subtype = " << mod->getSubType() << std::endl;
    if (autoDel)
    {
        delete mod;
    }
    return false;
}

void Manager::removeModKey(BaseMod *mod)
{
    std::stringstream sskey;
    sskey << "mod_" << mod->getType() << "_" << mod->getSubType();
    auto find = m_mod_map.find(sskey.str());
    if (find != m_mod_map.end())
    {
        m_mod_map.erase(sskey.str());
    }
}

Manager::~Manager()
{
    LOGDEBUF() << "析构操作开始" << std::endl;
    std::vector<std::string> will_remove_list;
    for (auto mod : m_mod_map)
    {
        will_remove_list.push_back( mod.first );
        if (mod.second != nullptr)
        {
            delete mod.second;
        }
    }

    for (auto key : will_remove_list)
    {
        m_mod_map.erase( key );
    }
    LOGDEBUF() << "析构操作完成" << std::endl;

}
